import threading
import logging
import time

FORMAT = "%(thread)d %(threadName)s %(message)s"
logging.basicConfig(level=logging.INFO, format=FORMAT)


def worker(s: threading.Semaphore):
    logging.info('before thread')
    s.acquire()
    logging.info('end thread')


# 初始化一个semaphore实例，信号量为3。
s = threading.Semaphore(3)

# 一开始主线程使用实例的3个信号，用光了。
logging.info(s.acquire())
logging.info(s.acquire())
logging.info(s.acquire())

# 这时用线程再次调用实例的信号量，没有信号
threading.Thread(target=worker, args=(s,)).start()

# 等5秒
time.sleep(5)

logging.info(s.acquire(False))  # 没有信号时，使用非阻塞
logging.info(s.acquire(timeout=3))  # 没有信号时，使用超时

# 增加一个信号，这时刚刚线程调用信号被阻塞的线程，现在应该恢复了
s.release()
